#include "StdSqlite3.h"
#include <sqlite3.h>
#include <stdio.h>
#include <stdlib.h>


struct StdSqlite3
{
    sqlite3 *db;//一个指向 SQLite3 数据库的指针
    // 其他成员...


};

// 初始化
SQL *StdSqlite3Init(const char *dbPath)
{
    SQL * s = (SQL *)malloc(sizeof(SQL));
    if (s == NULL)
    {
        printf("StdSqlite3Init malloc error\n");
        return NULL;
    }

    // 打开数据库
    int ret = sqlite3_open(dbPath, &s->db);
    if (ret != SQLITE_OK)
    {
        printf("open db error : %s\n", sqlite3_errmsg(s->db));
        free(s);
        return NULL;
    }
    return s;
}

// 数据库执行
bool SQLExec(SQL * s, const char *sql)
{
    int ret = sqlite3_exec(s->db, sql, NULL, NULL, NULL);
    if (ret != SQLITE_OK)
    {
        printf("EXEC db error : %s\n", sqlite3_errmsg(s->db));
        return false;
    }
    return true;
}

// 获取表的信息
// 它的作用是执行给定的 SQL 查询，并将结果以二维字符数组的形式返回。
char ** GetTableInfo(SQL *s, const char *sql, int * row, int *column)
{
    char* *result;
    int ret = sqlite3_get_table(s->db, sql, &result, row, column, NULL);
    if (ret != SQLITE_OK)
    {
        printf("get table error : %s\n", sqlite3_errmsg(s->db));
        return NULL;
    }
    return result;
}

void FreeTableInfo(char **result)
{
    sqlite3_free_table(result);
}

// 获取表的元素个数
int GetTableLen(SQL *s, const char *tableName)
{
    char sql[1024] = { 0 };
    sprintf(sql, "select count(*) from %s;", tableName);// 格式化输入到字符串里面
    char ** result = GetTableInfo(s, sql, NULL, NULL);
    if (result == NULL)
    {
        return -1;
    }
    int len = atoi(result[1]);//将结果数组中索引为 1 的字符串转换为整数
    sqlite3_free_table(result);
    return len;
}

void ClearSQL(SQL *s)
{
    sqlite3_close(s->db);
    free(s);
}
